package server

/**
gRPC 服务端
*/
import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	"google.golang.org/grpc/reflection"
	"log"
	pb "manage-service/proto"
	"manage-service/tools"
	"net"
)

// 监听Ip端口
const (
	RpcIp   = ""
	RpcPort = 9001
)

// 定义server，用来实现proto文件里面的 ManageService 服务里面的接口
type server struct{}

// GetThreshold 实现 GetThreshold 接口，参数一为上下文参数，所有接口默认都要必填；参数二为我们定义的 ManageReq 请求消息
// 返回值为 我们定义的 ManageRespList 消息，error返回值也是必须的。
func (s *server) GetThreshold(ctx context.Context, in *pb.ManageReq) (*pb.ManageRespList, error) {

	// 通过传进来的in对象的 Ip 和 Metric 去数据库中查找对应的行
	data := tools.GetDataByIpAndMetric(in.Ip, in.Metric)
	manageResp := make([]*pb.ManageResp, 0, 3)
	for _, table := range data {
		manageResp = append(manageResp, &pb.ManageResp{
			Ip:        table.Ip,
			Metric:    table.Metric,
			Threshold: table.Threshold,
			AlertType: table.AlertType,
		})
	}

	resp := &pb.ManageRespList{RespList: manageResp}
	return resp, nil
}

func GrpcServe() {
	// 监听 地址
	lis, err := net.Listen("tcp", fmt.Sprintf("%s:%d", RpcIp, RpcPort))
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}
	// 实例化 grpc 服务端
	s := grpc.NewServer()
	// 注册 ManageService(我的) 服务
	pb.RegisterManageServiceServer(s, &server{})
	// 往grpc服务端注册反射服务
	reflection.Register(s)
	log.Printf("启动grpc服务...\tIp:Port: %s\n", fmt.Sprintf("%s:%d", RpcIp, RpcPort))
	// 启动grpc服务
	if err := s.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}
